package comunicacion;

import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
import mensaje.*;
import estado.EstadoPartida;

/**
 * Responsabilidad: Interfaz de recepción de mensajes mediante sockets desde un cliente remoto.
 */

public class InterfazRecibe extends Thread{

    private Socket socket;
    private ObjectInputStream objin;
    private Buffer colaEntrada;
    private EstadoPartida estadoPartida;
    private Cliente cliente;

    public InterfazRecibe(Socket socket, Buffer colaEntrada, EstadoPartida estadoPartida){
        this.colaEntrada = colaEntrada;
        this.socket = socket;
        this.estadoPartida = estadoPartida;
    }

    public void setCliente(Cliente cliente){
        this.cliente = cliente;
    }

    @Override
    public void run(){
        Mensaje mensaje;
        BufferedInputStream buffer;
        try {
            buffer = new BufferedInputStream(socket.getInputStream());
            objin = new ObjectInputStream(buffer);
            buffer.mark(10);                         // buffer.mark() es una bandera al estado actual del buffer de entrada del socket.
            while (buffer.read() != -1) {
                                                     // buffer.read() bloquea el hilo mientras no haya nueva entrada en el buffer del socket,
                                                     // pero modifica el contenido, por lo que luego de usarlo hay que usar buffer.reset()
                buffer.reset();                      // para volver al estado anterior a esa lectura.
                mensaje = (Mensaje) estadoPartida.recibeDeSocket(objin, cliente); // Luego de recibir y desserializar un mensaje del buffer, hago mark de nuevo.
                buffer.mark(10);
                if(mensaje!=null)
                    colaEntrada.poner(mensaje);                 // Y encolo el mensaje en la cola de peticiones.
                if(mensaje == null){
                    mensaje = estadoPartida.enviarError();
                    cliente.getEnviador().enviar(mensaje);
                }
            }
        } catch (IOException ex) {
            Logger.getLogger(InterfazServidorCliente.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
